proc - {num1 num2} {
    return [expr {$num1 - $num2}]
}
proc + {num1 num2} {
    return [expr {$num1 + $num2}]
}
proc * {num1 num2} {
    return [expr {$num1 * $num2}]
}
proc / {num1 num2} {
    return [expr {$num1 / $num2}]
}
proc cos {angle} {
    return [expr cos($angle)]
}
proc sin {angle} {
    return [expr sin($angle)]
}
proc toInt {num} {
    return [expr int($num)]
}







#set table_joueurs [list [list [list 10 15 17 0 12 15 34 10 Guillaume 1224431] [list 11 -10.3 -80 [/ $Pi 3] 12 15 34 10 Ghislain 1224431]]]
#set table_ast [list [list [list 11122 80 80 0 12 9 9 0 [list J1 J2 J3 J4]] [list 11123 30 60 0 12 9 9 0 [list J1 J2 J3 J4]]]]


canvas .zoneGraphique -width $taille_ecran_x -height $taille_ecran_y -background white
pack .zoneGraphique -side left

canvas .zoneF -width 210 -height 220 -background white
pack .zoneF -side top

image create photo boox -format GIF -file $nom_image

.zoneF create image 105 100 -image boox



#on affiche le fond de la galaxie
.zoneGraphique create oval   0 0   $taille_ecran_x $taille_ecran_y    -fill "black" -outline "blue"

listbox .listbox_joueur
pack .listbox_joueur 

listbox .listbox_asteroide
pack .listbox_asteroide -side bottom -fill both

proc get_orientation {} {
    global table_joueurs
    return [get_joueur_angle [lindex $table_joueurs 0 0]]
}


proc dessine_asteroide {x y orientation n} {
    global Pi
    global .zonegraphique
    .zoneGraphique create oval [+ $x 10 ] [+ $y 10 ] [- $x 10 ] [- $y 10 ] -fill "white" -outline "white" -tags [list "asteroide" $n]
}
proc dessine_asteroides {centre_x centre_y} {
    global table_ast
    foreach i [lindex $table_ast 0] {
        set numero [lindex $i 0]
        set x_asteroide [lindex $i 1]
        set y_asteroide [lindex $i 2]
        set ast_orientation [lindex $i 3]
        set pst_ast_ecr_x [+ $x_asteroide $centre_x]
        set pst_ast_ecr_y [+ $y_asteroide $centre_y]
        dessine_asteroide  $pst_ast_ecr_x $pst_ast_ecr_y $ast_orientation $numero
    }
}

proc Maj_listbox_joueur {} {
    global table_joueurs
    global .listbox_joueur
    .listbox_joueur delete 0 end
    foreach i [lindex $table_joueurs 0] {
        .listbox_joueur insert end "[get_joueur_pseudo $i] [get_joueur_vitesse $i] [get_joueur_score $i]"
    }
}

proc Maj_listbox_asteroide {} {
    global table_ast
    global .listbox_asteroide
    .listbox_asteroide delete 0 end
    foreach i [lindex $table_ast 0] {
        .listbox_asteroide insert end get_asteroide_numero $i]
    }
}

proc dessine_vaisseau {x y orientation} {
    global Pi
    global .zonegraphique
    set pt1 [list [+ $x [* 10 [cos $orientation]]] [+ $y [* 10 [sin $orientation]]]]
    set pt2 [list [+ $x [* 5 [cos [+ $orientation [/ [* 2 $Pi] 3]]]]] [+ $y [* 5 [sin [+ $orientation [/ [* 2 $Pi] 3]]]]]]
    set pt3 [list [+ $x [* 5 [cos [+ $orientation [/ [* -2 $Pi] 3]]]]] [+ $y [* 5 [sin [+ $orientation [/ [* -2 $Pi] 3]]]]]]
    .zoneGraphique create polygon [lindex $pt1 0] [lindex $pt1 1] [lindex $pt2 0] [lindex $pt2 1] [lindex $pt3 0] [lindex $pt3 1]  -fill "white" -outline "white" -tags "vaisseau"
}
#############################################
#entree : le centre relatif 
#
#
proc dessine_vaisseaux {centre_x centre_y} {
    global table_joueurs
    foreach i [lindex $table_joueurs 0] {
        set vaisseau_orientation [lindex $i 3]
        set pst_vaisseau_ecr_x [+ [get_joueur_posX $i] $centre_x]
        set pst_vaisseau_ecr_y [+ [get_joueur_posY $i] $centre_y]
        dessine_vaisseau  $pst_vaisseau_ecr_x $pst_vaisseau_ecr_y $vaisseau_orientation
    }
}

proc boum {} {
    global _debug
    if {$_debug == 1} {
        puts "boum"
    }
    
}


proc collision_vaisseau_ast {} {
    global taille_ecran_y
    global taille_ecran_x
    set objet [.zoneGraphique find enclosed [- [/ $taille_ecran_x 2] 20] [- [/ $taille_ecran_y 2] 20] [+ [/ $taille_ecran_x 2] 20] [+ [/ $taille_ecran_y 2] 20]]
    for {set i 0} {$i<=[llength $objet]} {incr i} {
        set tags [.zoneGraphique itemcget [lindex $objet $i] -tags]
        if {[lindex $tags 0]=="asteroide"} {
            boum
        }
    }
}

proc MajEcran {} {
    global .zoneGraphique
    global table_ast
    global table_joueurs
    global taille_ecran_y
    global taille_ecran_x
    .zoneGraphique delete "vaisseau"
    .zoneGraphique delete "asteroide"
    #on considere le premier joueur de la liste comme le joueur principal
    set joueur_principal [lindex $table_joueurs 0 0]
    set x_joueur [get_joueur_posX $joueur_principal]
    set y_joueur [get_joueur_posY $joueur_principal]
    
    set centre_relatif_x [- [/ $taille_ecran_x 2] $x_joueur]
    set centre_relatif_y [- [/ $taille_ecran_y 2] $y_joueur]
        
    #on affiche le joueur principal
    
    dessine_vaisseau [/ $taille_ecran_x 2] [/ $taille_ecran_y 2] [get_joueur_angle $joueur_principal]
    #"on passe aux fonction suivante le centre de l'image relatif au joueur"
    dessine_vaisseaux  $centre_relatif_x $centre_relatif_y
    dessine_asteroides $centre_relatif_x $centre_relatif_y
    collision_vaisseau_ast
    Maj_listbox_joueur
    Maj_listbox_asteroide
}

proc chg_orientation_joueur {variation} {
    global Pi
    global table_joueurs
    set joueur_principal [lindex $table_joueurs 0 0]
    set_joueur_angle joueur_principal [+ [get_joueur_angle $joueur_principal] $variation]
    set table_joueurs [list [lreplace [lindex $table_joueurs 0 ] 0 0 $joueur_principal]]
}

proc affichage_laser {orientation origine_x origine_y rayon} {
    global .zoneGraphique
    set extremite_x [+ $origine_x [* $rayon [cos $orientation]]]
    set extremite_y [+ $origine_y [* $rayon [sin $orientation]]]
    set ligne [.zoneGraphique create line $origine_x $origine_y $extremite_x $extremite_y -fill white -tags "laser"]
    update
    after 100 { .zoneGraphique delete "laser" }
}

proc collision_rayon_ast {} {
    global rayon
    global table_ast
    global taille_ecran_y
    global taille_ecran_x
    
    for {set i 10} { $i <= $rayon } {incr i} {
        set x [+ [/ $taille_ecran_x 2] [* $i [cos [get_orientation]]]]
        set y [+ [/ $taille_ecran_y 2] [* $i [sin [get_orientation]]]]
        set objet  [.zoneGraphique find enclosed [- $x 20] [- $y 20] [+ $x 20] [+ $y 20]]
        if {"asteroide" == [lindex [.zoneGraphique itemcget $objet -tags] 0]} {
            set numero [lindex [.zoneGraphique itemcget $objet -tags] 1 ]
            foreach j [lindex $table_ast 0] {
                if {[get_asteroide_numero $j] == $numero} {

                    asteroide_detruite $j
                }
            }
        }
    }
}

proc lance_laser {} {
    global .zoneGraphique
    global taille_ecran_y
    global taille_ecran_x
    global rayon
    affichage_laser [get_orientation] [/ $taille_ecran_x 2] [/ $taille_ecran_y 2] $rayon
    collision_rayon_ast
}

bind . <Left> {
    global Pi
    chg_orientation_joueur [/ -$Pi 24]
    MajEcran
}

bind . <Right> {
    global Pi
    chg_orientation_joueur [/ $Pi 24]
    MajEcran
}

bind . <KeyPress> {
    global Pi
    switch %K {
        "space" { lance_laser  }
    }
}
proc Maj_Position_Joueur  {} {
    global Pi
    global table_joueurs
    set joueur_principal [lindex $table_joueurs 0 0]   
    set dx [* [get_joueur_vitesse $joueur_principal] [cos [get_joueur_angle $joueur_principal]]]
    set dy [* [get_joueur_vitesse $joueur_principal] [sin [get_joueur_angle $joueur_principal]]]
    set_joueur_posX joueur_principal [+ [get_joueur_posX $joueur_principal] $dx]
    set_joueur_posY joueur_principal [+ [get_joueur_posY $joueur_principal] $dy]
    set table_joueurs [list [lreplace [lindex $table_joueurs 0] 0 0 $joueur_principal]]
    MajEcran	
}

#fonction de debuggage au final il n'y a pas de deplacement a la main
bind . <Up> {
    global Pi
    global table_joueurs
    set joueur_principal [lindex $table_joueurs 0 0]
    set_joueur_vitesse joueur_principal [+ [get_joueur_vitesse $joueur_principal] 1 ]
    set table_joueurs [list [lreplace [lindex $table_joueurs 0] 0 0 $joueur_principal]]
}

bind . <Down> {
    global Pi
    global table_joueurs
    set joueur_principal [lindex $table_joueurs 0 0]
    set_joueur_vitesse joueur_principal [- [get_joueur_vitesse $joueur_principal] 1 ]
    set table_joueurs [list [lreplace [lindex $table_joueurs 0] 0 0 $joueur_principal]]
}
